package com.fulihui.wgj.schedule.job;

import com.alibaba.dubbo.config.annotation.Reference;
import com.fulihui.common.result.rpc.BaseResult;
import com.fulihui.common.result.rpc.SimpleResult;
import com.fulihui.common.util.DateUtils;
import com.fulihui.common.util.RpcResultCheckUtil;
import com.fulihui.wgj.facade.dto.TemplateAutoLogDTO;
import com.fulihui.wgj.facade.dto.TemplateAutoTaskDTO;
import com.fulihui.wgj.facade.request.PrimaryKeyRequest;
import com.fulihui.wgj.facade.request.autotask.AutoLogQueryRequest;
import com.fulihui.wgj.facade.request.autotask.AutoTaskQueryRequest;
import com.fulihui.wgj.facade.service.autotask.AutoTaskService;
import com.fulihui.wgj.facade.service.template.SendTemplateLogService;
import com.fulihui.wgj.facade.service.template.SendTemplateMsgService;
import com.fulihui.wgj.schedule.annotation.MutexLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

/**
 * 自动化定时发送
 *
 * @author wang_wx
 * @date 2018-08-03
 */
@Component
public class AutoTaskSendJob {

    private static final Logger LOGGER = LoggerFactory.getLogger(AutoTaskSendJob.class);

    /**
     * 允许的时间差值--5分钟
     */
    private static final long TIME_DIFFERENCE = 5L;

    @Reference(version = "1.0.0")
    SendTemplateLogService sendTemplateLogService;

    @Reference(version = "1.0.0")
    SendTemplateMsgService sendTemplateMsgService;

    @Reference(version = "1.0.0")
    AutoTaskService autoTaskService;

    @MutexLock(node = "${job.node.wxTemplateSendMsgJob_execute}")
    @Scheduled(cron = "${job.cron.wxTemplateSendMsgJob_execute}")
    public void execute() {
        LOGGER.info("AutoTaskSendJob start");
        Date nowTime = new Date();
        // 当前时间的时分秒
        String nowTimeHHMMSSStr = DateUtils.formatTimeFormat2(nowTime);
        // 当前时间的年月日
        String nowTimeDateStr = DateUtils.formatWebFormat(nowTime);

        AutoTaskQueryRequest autoTaskQueryRequest = new AutoTaskQueryRequest();
        autoTaskQueryRequest.setStatus(Boolean.TRUE);
        SimpleResult<List<TemplateAutoTaskDTO>> listSimpleResult = autoTaskService.queryAutoTask(autoTaskQueryRequest);
        LOGGER.info("autoTask on listSimpleResult={}", listSimpleResult);
        if (RpcResultCheckUtil.isSuccess(listSimpleResult)) {
            List<TemplateAutoTaskDTO> autoTaskDTOS = listSimpleResult.getData();
            if (CollectionUtils.isEmpty(autoTaskDTOS)) {
                LOGGER.info("there is no autoTask !");
                return;
            }

            autoTaskDTOS.stream().forEach(autoTaskDTO -> {
                Integer cycle = autoTaskDTO.getCycle();
                Long id = autoTaskDTO.getId();
                String sendTime = autoTaskDTO.getSendTime();
                // 发送时间的时分秒
                Date sendTimeHHMMSSStrDate;
                try {
                    sendTimeHHMMSSStrDate = DateUtils.parseTimeFormat2(sendTime);
                } catch (ParseException e) {
                    LOGGER.error("时间解析异常，不进行处理", e);
                    return;
                }
                Date nowHHMMSSStrDate;
                try {
                    nowHHMMSSStrDate = DateUtils.parseTimeFormat2(nowTimeHHMMSSStr);
                } catch (ParseException e) {
                    LOGGER.error("时间解析异常，不进行处理", e);
                    return;
                }
                Boolean flag = true;
                switch (cycle) {
                    //TODO 周期 1-每天 暂时只有周期每天的需求
                    case 1:
                        // 判断当天是否已经发送过
                        AutoLogQueryRequest autoLogQueryRequest = new AutoLogQueryRequest();
                        autoLogQueryRequest.setTaskId(id);
                        SimpleResult<List<TemplateAutoLogDTO>> queryAutoLogResult = autoTaskService.queryAutoLog(autoLogQueryRequest);
                        if (queryAutoLogResult.isSuccess()) {
                            List<TemplateAutoLogDTO> autoLogDTOS = queryAutoLogResult.getData();
                            if (!CollectionUtils.isEmpty(autoLogDTOS)) {
                                for (TemplateAutoLogDTO autoLogDTO : autoLogDTOS) {
                                    // 自动化发送记录的创建时间
                                    Date createTime = autoLogDTO.getGmtCreate();
                                    // 当天已经创建过批次 -- 则不进行发送
                                    if (nowTimeDateStr.equals(DateUtils.formatWebFormat(createTime))) {
                                        flag = false;
                                        break;
                                    }
                                }
                            }
                        }

                        /**
                         *  自动发送任务 设置的时间 如果是当天已经经过过去的时间 并且还没有进行发送过
                         *  为了保证每天正常发送 第一次会超过了时间也去发送 by WWX
                         *  否则如下午15:30创建了个任务 设置每天10:00:00发送 创建的那一会也会去发送本该从第二天10点发送的批次
                         */
                        long diffMinutes = DateUtils.getDiffMinutes(nowHHMMSSStrDate, sendTimeHHMMSSStrDate);
                        // 当前时间大于发送时间5分钟以上 不进行发送了
                        if (diffMinutes > TIME_DIFFERENCE) {
                            LOGGER.info("现在时间={}, 发送时间={}，相差{}分钟以上，不予发送", nowHHMMSSStrDate, sendTimeHHMMSSStrDate, TIME_DIFFERENCE);
                            break;
                        }
                        // 还没到时间 也不进行发送
                        long diffMinutes2 = DateUtils.getDiffSeconds(sendTimeHHMMSSStrDate, nowHHMMSSStrDate);
                        if (diffMinutes2 > 0) {
                            break;
                        }

                        if (flag) {
                            // 实际发送
                            PrimaryKeyRequest request = new PrimaryKeyRequest();
                            request.setId(id);
                            BaseResult result;
                            result = autoTaskService.sendTask(request);
                            if (result.isSuccess()) {
                                LOGGER.info("id=[{}]的自动任务执行成功", id);
                            } else {
                                LOGGER.info("id=[{}]的自动任务执行失败", id);
                            }
                        }
                        break;
                    default:
                        break;
                }
            });
        }
    }

}
